#ifndef ORIENTATION_HPP
#define ORIENTATION_HPP

//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------

namespace ImageAnalysis
{

//----------------------------------------------------------------------
// Cette classe permet de gérer  tout ce qui concerne les
// informations d'orientation comme l'orientation définie
// pour les voisins des pixels ou la direction des gradients.
//----------------------------------------------------------------------
class Orientation
{
public:
        //----------------------------------------------------------------------
        //
        //----------------------------------------------------------------------
	enum TOrientation { NORTH_WEST=0, NORTH=1, NORTH_EAST=2, WEST=3, CENTER=4, EAST=5, SOUTH_WEST=6, SOUTH=7, SOUTH_EAST=8 };

	//----------------------------------------------------------------------
        // Structure ( correspondance entre les indices de direction et les indices de voisinage cf. Layer::TNeighborHood )
	//----------------------------------------------------------------------
	enum TDirection { DIRECTION_3=0, DIRECTION_2=1, DIRECTION_1=2, DIRECTION_4=3, DIRECTION_0=5, DIRECTION_5=6, DIRECTION_6=7, DIRECTION_7=8 };

        //----------------------------------------------------------------------
	// Permet de convertir un angle en une direction approximée. L'angle doit
	// être compris entre 0 et 360 degrés
	//----------------------------------------------------------------------
        static TDirection ConvertAngleToDirection( float angle );

	//----------------------------------------------------------------------
	// Permet de convertir une direction en un angle en degrés
	//----------------------------------------------------------------------
	static float ConvertDirectionToAngle( TDirection direction );

	//----------------------------------------------------------------------
        // Permet de récupérer la direction opposée à la direction
	// passée en paramètre
        //----------------------------------------------------------------------
	static TDirection GetOppositeDirection( Orientation::TDirection direction );

	//----------------------------------------------------------------------
        // Permet de récupérer les deux directions adjacentes à une
	// direction donnée.
        //----------------------------------------------------------------------
	static void GetPossibleDirection( Orientation::TDirection normalDirection, Orientation::TDirection* possibleDirection );

	//----------------------------------------------------------------------
	// Permet de convertir une direction donnée en entier en une direction
	// de type TDirection
	//----------------------------------------------------------------------
        static TDirection ConvertDirectionToTDirection( int direction );

	//----------------------------------------------------------------------
	//
	//----------------------------------------------------------------------
	static Orientation::TDirection GetOrthogonalDirection( Orientation::TDirection direction );

private:
        //----------------------------------------------------------------------
        // Constructeur par copie et oprérateur d'affectation en privée pour
        // interdire leur utilisation
        //----------------------------------------------------------------------
	Orientation();
	~Orientation();
        Orientation( const Orientation& copy);
        Orientation& operator=( const Orientation& copy );
};

}

#endif //ORIENTATION_HPP
